package com.javaAdmin.controller;


import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.javaAdmin.model.Admin;
import com.javaAdmin.model.PageParam;
import com.javaAdmin.server.AdminServer;
import com.javaAdmin.util.Result;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * @author Administrator
 */
@RestController
@RequestMapping("/admin")
public class AdminController {

    @Resource
    private AdminServer adminServer;

    @PostMapping("/save")
    public Admin save(@RequestParam String name, @RequestParam String password, @RequestParam String roleId) {

        System.out.println(name);
        System.out.println(password);

        return adminServer.save(name, password, Integer.parseInt(roleId));
    }

    @DeleteMapping("/del/{id}")
    public Admin deleteById(@PathVariable String id) {
        return adminServer.deleteById(id);
    }


    @GetMapping("/list")
    public List<Admin> list() {
        return adminServer.list();
    }

    @GetMapping("/list2")
    public List<Admin> list2(@RequestParam("name") String name, @RequestParam("sex") String sex) {
        //第一种
        QueryWrapper queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", name);
        queryWrapper.like("name", name);
        return adminServer.list(queryWrapper);
    }

    @GetMapping("/list3")
    public List<Admin> list3(Admin admin) {
        //第二种
        LambdaQueryWrapper<Admin> lambdaQueryWrapper = new LambdaQueryWrapper();
        lambdaQueryWrapper.eq(Admin::getName, admin.getName());
        return adminServer.list(lambdaQueryWrapper);
    }

    @GetMapping("/listPage")
    public Page<Admin> list4(PageParam pageParam,Admin admin) {
        return adminServer.listPage(pageParam,admin);
    }

    @PostMapping("update")
    public Result update(Admin admin) {
        admin.setUpdateDate(new Date());
        boolean upStates = adminServer.updateById(admin);
        System.out.println(upStates);
        if (upStates) {
            return Result.success();
        } else {
            return Result.fail();
        }
    }

    @PostMapping("update2")
    public Result update2(Admin admin) {

        //UpdateWrapper：这是更传统的更新条件包装器。
        // 与 LambdaUpdateWrapper 不同，它不使用 lambda 表达式。
        // 相反，你需要直接使用属性的名字（通常是字符串形式）来构建条件。例如：
        //wrapper.eq(User::getAge, 30).set(User::getName, "John");
        //选择哪一个主要取决于你的偏好和项目的要求。
        //如果你喜欢 lambda 表达式的类型安全性并希望编译器能够帮助你检查属性的名称是否正确，那么 LambdaUpdateWrapper 可能更适合你。
        //如果你更喜欢传统的字符串方式，或者你的属性名称是在运行时动态确定的，那么 UpdateWrapper 可能更合适。

        UpdateWrapper updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("id", admin.getId());
        updateWrapper.set(StrUtil.isNotBlank(admin.getName()), "name", admin.getName());
        updateWrapper.set(StrUtil.isNotBlank(admin.getPassword()), "password", admin.getPassword());
        boolean upStates = adminServer.update(updateWrapper);
        System.out.println(upStates);
        if (upStates) {
            return Result.success();
        } else {
            return Result.fail();
        }
    }

    @PostMapping("update3")
    public Result update3(Admin admin) {

        LambdaUpdateWrapper<Admin> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(Admin::getId, admin.getId());
        //updateWrapper.gt(Admin::getId, admin.getId());
        //updateWrapper.lt(Admin::getId, admin.getId());

        updateWrapper.set(StrUtil.isNotBlank(admin.getName()), Admin::getName, admin.getName());
        updateWrapper.set(StrUtil.isNotBlank(admin.getPassword()), Admin::getPassword, admin.getPassword());

        boolean upStates = adminServer.update(updateWrapper);
        System.out.println(upStates);
        if (upStates) {
            return Result.success();
        } else {
            return Result.fail();
        }
    }
}
